package com.jztd.platfrom.base.model;

import com.jztd.platfrom.base.util.ObjectUtils;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.springframework.http.HttpStatus;

import java.io.Serializable;
import java.util.Objects;

/**
 * 请求结果对象
 *
 * @author lj
 * @date 2025/08/03
 */
@Setter
@Getter
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class Result<T> implements Serializable {
    /**
     * 结果数据
     *
     * @deprecated 20240812 已定义请求正常时直接返回数据实体，不会包裹在data中，此属性将在后续版本中移除
     */
    private T data;

    /**
     * 结果码
     */
    private Integer code;

    /**
     * 结果信息
     */
    private String message;

    /**
     * 时间戳
     */
    private final Long timestamp = System.currentTimeMillis();

    /**
     * 构造函数
     *
     * @param code    Http状态码
     * @param data    结果数据
     * @param message 结果信息
     *
     */
    @Deprecated
    private Result(Integer code, T data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }

    /**
     * 构造函数
     *
     * @param code    Http状态码
     * @param message 结果信息
     *
     */
    @Deprecated
    private Result(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 构建成功结果
     *
     * @return 结果对象
     *
     * @deprecated 20240812 新定义中仅代表异常时的返回，此方法将在后续版本中移除
     */
    @Deprecated
    public static <M> Result<M> success() {
        return success(null);
    }

    /**
     * 构建成功结果
     *
     * @param data 结果数据
     *
     * @return 结果对象
     *
     * @deprecated 20240812 新定义中仅代表异常时的返回，此方法将在后续版本中移除
     */
    @Deprecated
    public static <M> Result<M> success(M data) {
        return success(data, HttpStatus.OK.getReasonPhrase());
    }

    /**
     * 构建成功结果
     *
     * @param data    结果数据
     * @param message 结果信息
     *
     * @return 结果对象
     *
     * @deprecated 20240812 新定义中仅代表异常时的返回，此方法将在后续版本中移除
     */
    @Deprecated
    public static <M> Result<M> success(M data, String message) {
        return build(HttpStatus.OK, data, message);
    }

    /**
     * 构建异常结果
     *
     * @return 结果对象
     *
     * @deprecated 20240812 不应存在无参的异常返回，此方法将在后续版本中移除
     */
    @Deprecated
    public static <M> Result<M> error() {
        return error(null);
    }

    /**
     * 构建异常结果
     *
     * @param data 结果数据
     *
     * @return 结果对象
     *
     * @deprecated 20240812 新定义中仅代表异常时的返回，没有 `data`, 此方法将在后续版本中移除
     */
    @Deprecated
    public static <M> Result<M> error(M data) {
        ResultBuilder<M, ?, ?> builder = Result.builder();
        return builder
                .data(data)
                .message(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase())
                .build();
    }

    /**
     * 构建异常结果
     *
     * @param code    错误码
     * @param message 错误信息
     * @param <M>     结果数据类型
     *
     * @return 结果对象
     *
     * @deprecated 20240812 新定义中仅代表异常时的返回，此方法将在后续版本中移除
     */
    @Deprecated
    public static <M> Result<M> error(Integer code, String message) {
        ResultBuilder<M, ?, ?> builder = Result.builder();
        return builder
                .code(code)
                .message(message)
                .build();
    }

    /**
     * 构建异常结果
     *
     * @param data    结果数据
     * @param message 结果信息
     *
     * @return 结果对象
     *
     * @deprecated 20240812 新定义结构中不再包含 data、message 字段，此方法将在后续版本中移除
     */
    @Deprecated
    public static <M> Result<M> error(M data, String message) {
        ResultBuilder<M, ?, ?> builder = Result.builder();
        return builder
                .code(HttpStatus.INTERNAL_SERVER_ERROR.value())
                .data(data)
                .message(message)
                .build();
    }

    /**
     * 构建请求结果
     *
     * @param status Http状态
     *
     * @return 结果对象
     *
     */
    @Deprecated
    public static <M> Result<M> build(HttpStatus status) {
        return build(status, null);
    }

    /**
     * 构建请求结果
     *
     * @param status Http状态
     * @param data   结果数据
     *
     * @return 结果对象
     *
     */
    @Deprecated
    public static <M> Result<M> build(HttpStatus status, M data) {
        if(200  != status.value()){
            return build(status, null,data.toString());
        }
        return build(status, data, ObjectUtils.ifNull(status, HttpStatus::getReasonPhrase));
    }

    /**
     * 构建请求结果
     *
     * @param status  Http状态
     * @param data    结果数据
     * @param message 结果信息
     *
     * @return 结果对象
     *
     */
    @Deprecated
    public static <M> Result<M> build(@NonNull HttpStatus status, M data, String message) {
        return new Result<>(status.value(), data, message);
    }

    /**
     * 构建请求结果
     *
     * @param status  Http状态
     * @param data    结果数据
     * @param message 结果信息
     * @param <M>     结果数据类型
     *
     * @return 结果对象
     *
     */
    @Deprecated
    public static <M> Result<M> build(Integer status, M data, String message) {
        return new Result<>(status, data, message);
    }

    /**
     * 构建请求结果
     *
     * @param status  Http状态
     * @param message 结果信息
     * @param <M>     结果数据类型
     *
     * @return 结果对象
     *
     */
    @Deprecated
    public static <M> Result<M> build(@NonNull Integer status, String message) {
        return new Result<>(status, message);
    }

    /**
     * 判断是否为成功的请求结果
     *
     * @return true/false
     *
     * @deprecated 20240812 新定义中仅代表异常时的返回，此方法将在后续版本中移除
     */
    @Deprecated
    public boolean ok() {
        return Objects.equals(this.code, HttpStatus.OK.value());
    }
}
